/*
Copyright 2021.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package v1

import (
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// EDIT THIS FILE!  THIS IS SCAFFOLDING FOR YOU TO OWN!
// NOTE: json tags are required.  Any new fields you add must have json tags for the fields to be serialized.

// HarborServiceSpec defines the desired state of HarborService
type HarborServiceSpec struct {
	// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
	// Important: Run "make" to regenerate code after modifying this file
	InstanceInfo InstanceInfo `json:"instanceInfo,omitempty"`
	// Foo is an example field of HarborService. Edit harborservice_types.go to remove/update
	Foo string `json:"foo,omitempty"`
}

type InstanceInfo struct {
	InstanceName  string   `json:"instanceName,omitempty"`
	NodePortIndex int64    `json:"nodePortIndex,omitempty"`
	RedisDbIndex  int64    `json:"redisDbIndex,omitempty"`
	S3Config      S3Config `json:"s3Config,omitempty"`
}

type S3Config struct {
	Bucket         string `json:"bucket,omitempty"`
	Accesskey      string `json:"accesskey,omitempty"`
	SecretKey      string `json:"secretkey,omitempty"`
	RegionEndpoint string `json:"regionendpoint,omitempty"`
}

// HarborServiceStatus defines the observed state of HarborService
type HarborServiceStatus struct {
	// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
	// Important: Run "make" to regenerate code after modifying this file
	Condition   Condition `json:"condition,omitempty"`
	ExternalUrl string    `json:"externalUrl,omitempty"`
}

type Condition struct {
	Phase   string `json:"phase,omityempty"`
	Reason  string `json:"reason,omitempty"`
	Message string `json:"message,omitempty"`
}

//+kubebuilder:object:root=true
//+kubebuilder:subresource:status

// HarborService is the Schema for the harborservices API
type HarborService struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   HarborServiceSpec   `json:"spec,omitempty"`
	Status HarborServiceStatus `json:"status,omitempty"`
}

//+kubebuilder:object:root=true

// HarborServiceList contains a list of HarborService
type HarborServiceList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []HarborService `json:"items"`
}

func init() {
	SchemeBuilder.Register(&HarborService{}, &HarborServiceList{})
}
